#ifndef _ISO14443A_H_
#define _ISO14443A_H_

#include "rfid_board.h"

#if _RFID_FUNCTION_ENABLE_

// TypeA 操作命令
#define PICC_REQIDL                                  0x26 // 寻找未被置成暂停状态的卡
#define PICC_REQALL                                  0x52 // 寻找所有在操作区域内的卡
#define PICC_ANTICOLL1                               0x93 // 防冲突
#define PICC_ANTICOLL2                               0x95 // 选择一张卡
#define PICC_AUTHENT1A                               0x60 // 验证密钥A
#define PICC_AUTHENT1B                               0x61 // 验证密钥B
#define PICC_READ                                    0x30 // 读取
#define PICC_WRITE                                   0xA0 // 写块
#define PICC_DECREMENT                               0xC0 // 减法
#define PICC_INCREMENT                               0xC1 // 加法
#define PICC_RESTORE                                 0xC2 // 存储指令
#define PICC_TRANSFER                                0xB0 // 传输
#define PICC_HALT                                    0x50 // 暂停
#define PICC_WAKEUP                                  0x52 // 唤醒

/**
 * @brief 卡睡眠
 * 
 * @param AnticollisionFlag - 防冲撞标识
 * @return uint8_t  - 错误代码
 */
extern uint8_t TypeAHalt(void);

/**
 * @brief 卡唤醒
 * 
 * @return uint8_t  - 错误代码
 */
extern uint8_t TypeAWakeUp(void);

/**
 * @brief 寻卡
 *
 * @param RequestCode - 寻卡方式
 *                      0x26：寻天线区内未进入休眠状态
 *                      0x52：寻天线区内全部卡
 * @param pTagType    - 0x4400 = Mifare_UltraLight
 *                      0x0400 = Mifare_One(S50)
 *                      0x0200 = Mifare_One(S70)
 *                      0x0800 = Mifare_Pro(X)
 *                      0x4403 = Mifare_DESFire
 * @return uint8_t    - 错误代码
 */
extern uint8_t TypeARequest(uint8_t RequestCode, uint8_t *pTagType);

/**
 * @brief 防冲突
 *
 * @param pSnr     - 用于保存卡片序列号
 * @return uint8_t - 错误代码
 */
extern uint8_t TypeAAnticollision(uint8_t *pSnr);

/**
 * @brief 选择一张卡
 *
 * @param pSnr     - 卡序号
 * @return uint8_t - 错误代码
 */
extern uint8_t TypeASelect(uint8_t *pSnr);

/**
 * @brief 寻找一张 A 卡，如成功则输出卡号
 * 
 * @param pCardSn - A 卡卡号
 * @return bool - 执行状态（true：成功 false：失败）
 */
extern bool TypeAAuthenticate(uint8_t *pCardSn);

#endif
#endif
